// 1905. [队列BFS/例子]销售点分布调查
// https://oj.rnd.huawei.com/problems/1905/details
// 输入 第一行一个整数 N 表示销售负责人总数，取值范围：[1,100)。
// 第二行一个整数 M （0 <= M < N）表示有下属的负责人的人数。
// 随后 M 行，每行给出一位负责人，格式为ID K ID[1] ID[2] ... ID[K]，
// 其中 ID 是该负责人的代号，K (K > 0) 是其下属人数，后面给出的其下属们的代号。
// 最后一行给出待统计的指定负责人的代号ID
// 输出两个数字，依次表示指定负责人名下人数最多的层级，及该层级的人数。
// 输入 23
// 13
// 21 1 23
// 01 4 03 02 04 05
// 03 3 06 07 08
// 06 2 12 13
// 13 1 21
// 08 2 15 16
// 02 2 09 10
// 11 2 19 20
// 17 1 22
// 05 1 11
// 07 1 14
// 09 1 17
// 10 1 18
// 01
// 输出 [4 9]

#include <algorithm>
#include <iostream>
#include <queue>
#include <string>
#include <utility>
#include <vector>
using namespace std;
class Solution {
 public:
  // 待实现函数，在此函数中填入答题代码;
  // total 总人数, relations：{销售主管ID, 手下销售ID数组}, appointSale
  // 要计算的销售负责人
  vector<int> PointSaleSurvey(const int &total,
                              const vector<pair<int, vector<int>>> &relations,
                              int appointSale) {
    // 简单BFS遍历，用队列记录每层的销售人数
    int hierarchy = 1, maxHierarchy = 1;
    int maxCount = 1;
    queue<int> q;
    q.push(appointSale);
    while (!q.empty()) {
      //记录此时该层销售ID数量。
      int queueSize = q.size();
      if (maxCount < queueSize) maxCount = queueSize, maxHierarchy = hierarchy;
      //逐个遍历该层销售ID，找到它们的子节点销售ID并放入队列中
      //注意此时用的是前面专门记录的queueSize
      for (int k = 0; k < queueSize; k++) {
        int node = q.front();
        q.pop();
        vector<int> childSale;
        //从输入的relations数组里找到该销售ID
        for (int i = 0; i < relations.size(); i++) {
          //用childSale存它的子节点销售ID
          if (relations[i].first == node) childSale = relations[i].second;
        }
        //将该销售ID的子节点销售ID放入队列中
        for (auto i : childSale) q.push(i);
      }
      //记录当前的层数
      hierarchy++;
    }
    return {maxHierarchy, maxCount};
  }
};
inline int ReadInt() {
  int number;
  cin >> number;
  return number;
}
template <typename T>
inline vector<T> ReadVector(int size) {
  vector<T> objects(size);
  for (int i = 0; i < size; ++i) {
    cin >> objects[i];
  }
  return objects;
}
template <typename T>
inline void WriteVector(const vector<T> &objects, char delimeter = ' ') {
  auto it = objects.begin();
  if (it == objects.end()) {
    return;
  }
  cout << *it;
  for (++it; it != objects.end(); ++it) {
    cout << delimeter << *it;
  }
}
int main() {
  int total;
  cin >> total;
  int row = ReadInt();
  vector<pair<int, vector<int>>> relations;
  for (int i = 0; i < row; i++) {
    int sup = ReadInt();                           // 主管
    int subCnt = ReadInt();                        // 下属个数
    vector<int> oneRow = ReadVector<int>(subCnt);  // 下属
    relations.push_back(make_pair(sup, oneRow));
  }
  int appointSale;
  cin >> appointSale;
  Solution solu;
  auto numbers = solu.PointSaleSurvey(total, relations, appointSale);
  cout << "[";
  WriteVector(numbers, ' ');
  cout << "]" << endl;
  return 0;
}
